package edu.put.sk.nrpp.ospf.packet.lsa;


import edu.put.sk.nrpp.*;

/**
 * Router-LSAs are the Type 1 LSAs.  Each router in an area originates
 *   a router-LSA.  The LSA describes the state and cost of the router's
 *   links (i.e., interfaces) to the area.  All of the router's links to
 *   the area must be described in a single router-LSA.  For details
 *   concerning the construction of router-LSAs, see Section 12.4.1.
 *   <pre>
 *      0                   1                   2                   3
 *      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *0  0  |            LS age             |     Options   |       1       |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *1  32 |                        Link State ID                          |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *2  64 |                     Advertising Router                        |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *3  96 |                     LS sequence number                        |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *4  128|         LS checksum           |             length            |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *5  160|    0    |V|E|B|        0      |            # links            |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *6  192|                          Link ID                              |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *7  224|                         Link Data                             |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *8  256|     Type      |     # TOS     |            metric             |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *9  288|                              ...                              |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *10 320|      TOS      |        0      |          TOS  metric          |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *11 352|                          Link ID                              |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *12 384|                         Link Data                             |
 *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *13 416|                              ...                              |
 *</pre>
 * description from RFC 2328
 *      
 * @author kevin
 */

public class LSAType1 extends LSA {

	protected LSAType1Data[] LSData;
	
	
	public LSAType1Data[] getLSAData(){
		return LSData;
	}
	
	protected LSAType1 (Bit[] data) throws Exception {
		super(data);
		int zer0=Bit.toInt(Bit.cut(data, 160, 164));
		int zer1=Bit.toInt(Bit.cut(data, 168, 175));
		
		if(zer0!=0&&zer1!=0){
			throw new Exception("LSAType1 wrong null fields: "+ zer0+" or: "+zer1);
		}
		
		LSData=new LSAType1Data[getLinksCount()];
		for(int i=0; i<getLinksCount(); i++){
			LSData[i]=new LSAType1Data(Bit.cut(data, 192+i*96, 192+(i+1)*96-1));
			System.out.println("Router:\t"+getLinkStateId()+"\t"+LSData[i].toString());
		}
	}
	
	
	/**
     * # links
     * The number of router links described in this LSA.  This must be
     * the total collection of router links (i.e., interfaces) to the
     * area.
	 * @return number of links
	 */
	public int getLinksCount(){
		return Bit.toInt(Bit.cut(_data, 175, 191));
	}
	
	/**
	 * bit V
     * When set, the router is an endpoint of one or more fully
     * adjacent virtual links having the described area as Transit area
     * (V is for virtual link endpoint).
	 * @return V
	 */
	
	public int getV(){
		return Bit.toInt(Bit.cut(_data, 165, 165));
	}
	
	/**
     * bit B
     * When set, the router is an area border router (B is for border).
	 * @return B
	 */
	
	public int getB(){
		return Bit.toInt(Bit.cut(_data, 167, 167));
	}
	
	/**
	 * bit V
     * When set, the router is an endpoint of one or more fully
     * adjacent virtual links having the described area as Transit area
     * (V is for virtual link endpoint).
	 * @return V
	 */
	public int getE(){
		return Bit.toInt(Bit.cut(_data, 166, 166));
	}
}
